package com.atxiao.util;

import cn.hutool.core.io.FileUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component
public class ImageUtil {

    /**
     * 可在yml文件中配置存储路径
     */
    @Value(value = "${spring.http.multipart.location}")
    private static String fileDir="D:\\data\\file\\xy\\web\\lxxMerchant";
    /**
     * 定义路径分割符（未避免操作系统不一致导致的路径分隔符出错）
     * 说明：windows和linux通用
     */
    public static final String separator = File.separator;
    /**
     * 上传文件到服务器路径下
     * @param folder    分类文件夹名称
     * @param file      文件
     * @return
     */
    public static Map<String, String> uploadFile(String folder, MultipartFile file) {
        //定义返回结果集合
        Map<String, String> map = new HashMap<>(4);
        //存储路径
        String fileDir = ImageUtil.fileDir;
        //获取原文件名
        map.put("originName", file.getOriginalFilename());
        //获取文件后缀
        String filename = file.getOriginalFilename().split("\\.")[1];
        //生成UUID作为文件名避免文件名重复而出现问题
        String uuid = UUID.randomUUID().toString().replace("-", "");
        //拼接后得到存储时的文件名
        filename = uuid.concat(".").concat(filename);

        //增加分类文件夹以便于备份
        fileDir = fileDir.concat(separator).concat(folder).concat(separator);
        //判断分类文件夹是否存在，不存在则创建
        if (!FileUtil.exist(fileDir)) {
            FileUtil.mkdir(fileDir);
        }
        //生成服务器存储文件对象
        File serverFile = new File(fileDir + filename);
        try {
            InputStream is = file.getInputStream();
            //获取文件类型，如不需要这块代码可以不用。
            //其实前端也可做文件类型判断，但最好是使用此方法做类型判断。
            //因为它是根据输入流判断的，相对更加准确
//            FileType fileType = getFileType(is);
//            if (null == fileType){
//                map.put("type","未识别文件类型");
//            }else {
//                map.put("type",fileType.name());
//            }
            //transferTo方法中传递的file如果是路径的话，那么它会将最后一层路径当做文件名，没有后缀的那种。
            //所以，上面的filename一定要有后缀名
            file.transferTo(serverFile);
            //放入服务器存储的文件名
            map.put("fileName", filename);
            //存储相对路径地址
            map.put("filePath", "/file/" + folder + "/" + filename);
            //关闭流
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //添加路径名称对应表
        //下面的代码是对原始文件名的保存，对以后添加下载功能提供支持
        //这里不提供实现方式，主要突出的思想，任何功能的实现都要考虑其完整性及以后的扩展问题
//        FileUrlName fileUrlName = new FileUrlName();
//        fileUrlName.setFileName(map.get("originName").replace("[","_").replace("]","_"));
//        fileUrlName.setFileUrl(map.get("filePath"));
//        fileUrlNameDAO.insertSelective(fileUrlName);
        return map;
    }


}
